From 9a0989226b7235be503b0945869cbdbf9eeba434 Mon Sep 17 00:00:00 2001 From: Klaus Purer Date: Sun, 18 Mar 2018 22:20:22 +0100 Subject: [PATCH] feat(resolver): Add CLI option to resolve minimal version dependencies --- src/cargo/core/features.rs | 2 ++ src/cargo/core/resolver/mod.rs | 14 ++++++++++++-- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/src/cargo/core/features.rs b/src/cargo/core/features.rs index 4bdcc08a8..3ce6a8267 100644 --- a/src/cargo/core/features.rs +++ b/src/cargo/core/features.rs @@ -285,6 +285,7 @@ pub struct CliUnstable { pub offline: bool, pub no_index_update: bool, pub avoid_dev_deps: bool, + pub minimal_versions: bool, } impl CliUnstable { @@ -317,6 +318,7 @@ impl CliUnstable { "offline" => self.offline = true, "no-index-update" => self.no_index_update = true, "avoid-dev-deps" => self.avoid_dev_deps = true, + "minimal-versions" => self.minimal_versions = true, _ => bail!("unknown `-Z` flag specified: {}", k), } diff --git a/src/cargo/core/resolver/mod.rs b/src/cargo/core/resolver/mod.rs index 63b13cbaa..5a8043b90 100644 --- a/src/cargo/core/resolver/mod.rs +++ b/src/cargo/core/resolver/mod.rs @@ -430,7 +430,11 @@ pub fn resolve( warnings: RcList::new(), }; let _p = profile::start("resolving"); - let mut registry = RegistryQueryer::new(registry, replacements, try_to_use); + let minimal_versions = match config { + Some(config) => config.cli_unstable().minimal_versions, + None => false, + }; + let mut registry = RegistryQueryer::new(registry, replacements, try_to_use, minimal_versions); let cx = activate_deps_loop(cx, &mut registry, summaries, config)?; let mut resolve = Resolve { @@ -683,6 +687,7 @@ struct RegistryQueryer<'a> { try_to_use: &'a HashSet<&'a PackageId>, // TODO: with nll the Rc can be removed cache: HashMap>>, + minimal_versions: bool, } impl<'a> RegistryQueryer<'a> { @@ -690,12 +695,14 @@ impl<'a> RegistryQueryer<'a> { registry: &'a mut Registry, replacements: &'a [(PackageIdSpec, Dependency)], try_to_use: &'a HashSet<&'a PackageId>, + minimal_versions: bool, ) -> Self { RegistryQueryer { registry, replacements, cache: HashMap::new(), try_to_use, + minimal_versions, } } @@ -797,7 +804,10 @@ impl<'a> RegistryQueryer<'a> { let b_in_previous = self.try_to_use.contains(b.summary.package_id()); let a = (a_in_previous, a.summary.version()); let b = (b_in_previous, b.summary.version()); - a.cmp(&b).reverse() + match self.minimal_versions { + true => a.cmp(&b), + false => a.cmp(&b).reverse(), + } }); let out = Rc::new(ret); -- 2.30.2